//原文链接：https://blog.csdn.net/ITSOK_123/article/details/124252254
//erase库函数处理重复空格
string reverseWords(string s) {
        //先进行去除重复空格，然后将字符串倒置--再进行局部倒置
        
        int pos=0;
        int len = s.size();
        //去除重复空格
        for(int i = len-1;i>0;i--){
            if(s[i]==' ' && s[i]==s[i-1]){
                s.erase(i,1);
            }
        }
        if(s[s.size()-1]==' ') s.erase(s.size()-1,1);
        if(s[0]==' ') s.erase(s.begin());
        len = s.size();
        //字符串倒置
        reverse(s.begin(),s.end());
        //以空格为分隔倒置单词
        for(int i=0;i<len;){
            pos = s.find_first_of(' ',i);
            int left,right;
            //判断是否到最后一个单词
            if(pos!=string::npos){
                left = i;
                right = pos-1;
            }else{
                //到了最后一个单词
                left=i,right=len-1;
            }
            while(left<right){
               swap(s[right],s[left]);
               left++;
               right--;
            }
            //如果已经倒置完最后一个单词则退出
            if(pos!=string::npos){
                i=pos+1;
            }else break;
        }
         return s;
    }
//双指针处理重复空格
class Solution {
public:
    string reverseWords(string s) {
        //先进行去除重复空格，然后将字符串倒置--再进行局部倒置
        int pos=0;
        int len = s.size();
        //去除重复空格
        int slow =0,fast;
        for(fast = 0;fast<len;fast++){
            //快指针遍历到正常单词就通过慢指针一个个位置从前到后赋值
            if(s[fast] != ' '){
            //slow不为0说明已经输出了一个单词，需要一个空格来分隔
                if(slow !=0 ) s[slow++]=' ';
                //逐步复制单词
                while(fast<s.size() && s[fast]!=' '){
                    s[slow++]=s[fast++];
                }
            }
            //如过遍历到空格快指针迁移，慢指针不动
        }
        //字符串大小修改
        s.resize(slow);
        len = s.size();
        //字符串倒置
        reverse(s.begin(),s.end());
        //以空格为分隔倒置单词
        slow =0;
        for(fast =0;fast<len;fast++){
            //这里的左右指针必须初始化
            int left=0,right=0;
            //快指针指向空格则说明是一个新的单词
            //进行上一个单词的倒置
            if(s[fast] == ' '){
                left = slow;
                right = fast-1;
            }
            //如果是最后一个单词的话
            else if(fast == len-1){
                left = slow;
                right = fast;
            } 
            while(left<right){
                    swap(s[right],s[left]);
                    left++;
                    right--;
                }
            //slow指针更新
             if(s[fast] == ' ') slow = fast+1; 
        }
         return s;
    }
};
